package com.imooc.course.server.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.imooc.course.server.dao.MemberCourseDao;
import com.imooc.course.server.dto.MemberCourseDto;
import com.imooc.course.server.dto.PageDto;
import com.imooc.course.server.entity.MemberCourse;
import com.imooc.course.server.entity.MemberCourseExample;
import com.imooc.course.server.service.MemberCourseService;
import com.imooc.course.server.utils.CopyUtil;
import com.imooc.course.server.utils.UuidUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

@Service("memberCourseService")
public class MemberCourseServiceImpl implements MemberCourseService {

    private static final Logger log = LoggerFactory.getLogger(MemberCourseServiceImpl.class);

    @Resource(name = "memberCourseDao")
    private MemberCourseDao memberCourseDao;

    /**
     * 列表查询
     * @param pageDto
     */
    @Override
    public void getList(PageDto pageDto) {
        PageHelper.startPage(pageDto.getPage(),pageDto.getSize());

        MemberCourseExample memberCourseExample = new MemberCourseExample();
        List<MemberCourse> memberCourseList = memberCourseDao.selectByExample(memberCourseExample);

        PageInfo<MemberCourse> memberCoursePageInfo = new PageInfo<>(memberCourseList);
        pageDto.setTotal(memberCoursePageInfo.getTotal());

        List<MemberCourseDto> memberCourseDtoList = CopyUtil.copyList(memberCourseList, MemberCourseDto.class);

        pageDto.setList(memberCourseDtoList);
    }

    /**
     * 保存，id有值为更新，id无值为新增
     * @param memberCourseDto
     */
    @Override
    public void save(MemberCourseDto memberCourseDto) {
        MemberCourse copy = CopyUtil.copy(memberCourseDto, MemberCourse.class);
        String id = memberCourseDto.getId() != null ? memberCourseDto.getId().trim() : memberCourseDto.getId();
        if (StringUtils.isEmpty(id)) {
            this.addMemberCourse(copy);
        }else{
            this.updateMemberCourse(copy);
        }
    }

    private void updateMemberCourse(MemberCourse copy) {
        memberCourseDao.updateByPrimaryKeySelective(copy);
    }

    private void addMemberCourse(MemberCourse copy) {
        copy.setId(UuidUtil.getShortUuid());
        memberCourseDao.insertSelective(copy);
    }

    /**
     * 删除
     * @param id
     */
    @Override
    public void delete(String id) {
        memberCourseDao.deleteByPrimaryKey(id);
    }

    /**
     * 会员报名课程
     * @param memberCourseDto
     * @return
     */
    @Override
    public MemberCourseDto enroll(MemberCourseDto memberCourseDto) {
        // 先判断是否已经报名，没有报名则insert，已报名的则select结果返回
        MemberCourse memberCourseDb = this.joinOrNot(memberCourseDto.getMemberId(), memberCourseDto.getCourseId());
        if (memberCourseDb == null) {
            // MyBatis使用useGeneratedKeys=true，
            // 在inset数据之后，只能给mc对象实例设置好主键id，并不能为mc对象实例设置数据库自动生成的时间
            memberCourseDto.setAt(new Date(new Date().getTime()));
            MemberCourse mc = CopyUtil.copy(memberCourseDto, MemberCourse.class);
            this.addMemberCourse(mc);
            return CopyUtil.copy(mc, MemberCourseDto.class);
        } else {
            return CopyUtil.copy(memberCourseDb, MemberCourseDto.class);
        }
    }


    /**
     * 根据会员id和课程id查询会员是否已经关联课程
     * @param memberId
     * @param courseId
     * @return
     */
    @Override
    public MemberCourse joinOrNot(String memberId, String courseId) {
        MemberCourseExample example = new MemberCourseExample();
        example.createCriteria().andMemberIdEqualTo(memberId)
                .andCourseIdEqualTo(courseId);
        List<MemberCourse> memberCourseList = memberCourseDao.selectByExample(example);
        if (CollectionUtils.isEmpty(memberCourseList)) {
            return null;
        } else {
            return memberCourseList.get(0);
        }
    }

    /**
     * 获取会员的课程报名信息
     * @param memberCourseDto
     * @return
     */
    @Override
    public List<MemberCourseDto> getEnroll(MemberCourseDto memberCourseDto) {
        MemberCourseExample example = new MemberCourseExample();
        example.createCriteria().andMemberIdEqualTo(memberCourseDto.getMemberId());
        List<MemberCourse> memberCourseList = memberCourseDao.selectByExample(example);
        return CopyUtil.copyList(memberCourseList, MemberCourseDto.class);
    }
}
